import * as r from 'ramda'

/**
 * 代理函数执行
 * @type {{get: ((function(*, *, *): (function(): *))|*)}}
 */
const handler = {
    get: function (target, p, receiver) {
        if (!r.isNil(target[p])) {
            // 使用本身方法
            if (r.is(Function, target[p])) {
                return (...arg) => {
                    let result = target[p].call(target, ...arg)
                    return pack(result)
                }
            }
            // 使用本身属性
            else {
                return pack(target[p])
            }
        }
        // 使用ramda方法
        if (r[p] instanceof Function) {
            let func;
            if (r[p].length > 1) {
                const paramList = new Array(r[p].length - 1).fill(r.__)
                func = r[p](...paramList, target)
            } else {
                func = () => r[p](target)
            }
            return (...args) => {
                let result = func(...args)
                return pack(result)
            }
        }
        return target[p]
    }
}

/**
 * 数据是否为数组或者对象
 */
function isAO(data) {
    return ['[object Object]', '[object Array]'].includes(Object.prototype.toString.call(data))
}

/**
 * 如果是对象或数组则包装成proxy
 */
function pack(data) {
    if (isAO(data)) {
        return new Proxy(data, handler)
    } else {
        return data
    }
}

export function Chain(data) {
    return pack(data)
}

export default Chain
